#include "hud_item_shield.h"

extern int G_W, G_H;

HUD_ITEM_SHIELD::HUD_ITEM_SHIELD(CASH *cash):QObject(), QGraphicsItemGroup()
{

    this->cash=cash;

    init();
    init_decor();
}

QPainterPath HUD_ITEM_SHIELD::shape() const
{
    return QPainterPath();
}

//функция инициализации hud
void HUD_ITEM_SHIELD::init()
{
    //создаем временные шкалы
    tl_anim_items = new QTimeLine(800, this);
    tl_anim_scale = new QTimeLine(500, this);

    //создаем массив для хранения анимаций
    lst_anims = new QList<QGraphicsItemAnimation*>();

    //загружаем картинку
    shield_item = cash->cash_pixmap->value(DEF_HUD_PATH + "shield_item.svg");

    //создаем временные переменные
    int tmp_w = 0;
    points = 0;

    GRAPHICS_PIXMAP_ITEM *item;
    QGraphicsItemAnimation *anim;

    //заполняем массивы настроенными анимациями
    for(int i=0;i<5;i++){
        item = new GRAPHICS_PIXMAP_ITEM(*shield_item, this);
        anim = new QGraphicsItemAnimation();

        lst_anims->append(anim);
        anim->setItem(item);

        item->setPos(- G_W, - G_H);
        anim->setPosAt(0, QPointF((((G_W - 52) - (item->boundingRect().width())*2) - tmp_w), 29));
        anim->setPosAt((i + 1)*0.1, QPointF(((G_W - 52) - item->boundingRect().width()) - tmp_w, 29));

        anim->setTimeLine(tl_anim_items);

        tmp_w += item->boundingRect().width() + 3;
        points++;

        anim = new QGraphicsItemAnimation();

        anim->setItem(item);
        anim->setTimeLine(tl_anim_scale);

        anim->setScaleAt(0, 1, 1);
        anim->setScaleAt(0.5, 1.3, 1.3);
        anim->setScaleAt(1, 1, 1);
    }

    //дбавляем эффект отбрасываемой тени
    QGraphicsDropShadowEffect *hud_shadow = new QGraphicsDropShadowEffect(this);
    hud_shadow->setBlurRadius(7);
    hud_shadow->setColor(QColor("#2d5cff"));
    hud_shadow->setOffset(0);

    this->setGraphicsEffect(hud_shadow);
}

//функция инициализации оформления hud
void HUD_ITEM_SHIELD::init_decor()
{
    tl_anim_decor = new QTimeLine(500);
    tl_anim_decor->setEasingCurve(QEasingCurve::Linear);

    shield_icon = new GRAPHICS_PIXMAP_ITEM(*cash->cash_pixmap->value(DEF_HUD_PATH + "shield_icon.svg"), this);
    shield_border = new GRAPHICS_PIXMAP_ITEM(*cash->cash_pixmap->value(DEF_HUD_PATH + "shield_border.svg"), this);

    shield_icon->setPos(- G_W, - G_H);
    shield_border->setPos(- G_W, - G_H);

    QGraphicsItemAnimation *anim_decor = new QGraphicsItemAnimation();

    anim_decor->setItem(shield_icon);
    anim_decor->setTimeLine(tl_anim_decor);

    anim_decor->setPosAt(0, QPointF(G_W, 12));
    anim_decor->setPosAt(0.5, QPointF(G_W - 52, 12));

    anim_decor = new QGraphicsItemAnimation();

    anim_decor->setItem(shield_border);
    anim_decor->setTimeLine(tl_anim_decor);

    anim_decor->setPosAt(0, QPointF(G_W - 241, - shield_border->boundingRect().height()));
    anim_decor->setPosAt(0.5, QPointF(G_W - 241, 20));
}

//gets sets
void HUD_ITEM_SHIELD::set_points(int value)
{
    this->points = value;
    value--;

    tl_anim_scale->start();

    for(int i=0;i<lst_anims->count();i++){
        if(i > value && i < lst_anims->count())
            lst_anims->at(i)->item()->setVisible(false);

        if(i >= 0 && i <= value)
            lst_anims->at(i)->item()->setVisible(true);
    }
}

int HUD_ITEM_SHIELD::get_points()
{
    return this->points;
}

HUD_ITEM_SHIELD::~HUD_ITEM_SHIELD()
{
}

//слоты анимаций show hide
void HUD_ITEM_SHIELD::show_hud()
{
    tl_anim_decor->stop();
    tl_anim_decor->setDirection(QTimeLine::Forward);
    tl_anim_decor->start();

    connect(tl_anim_items, SIGNAL(valueChanged(qreal)), this, SLOT(slot_show_items()));

    tl_anim_items->stop();
    tl_anim_items->setDirection(QTimeLine::Forward);
    tl_anim_items->start();
}

void HUD_ITEM_SHIELD::hide_hud()
{
    tl_anim_decor->stop();
    tl_anim_decor->setDirection(QTimeLine::Backward);
    tl_anim_decor->start();

    tl_anim_items->stop();
    tl_anim_items->setDirection(QTimeLine::Backward);
    tl_anim_items->start();

    connect(tl_anim_items, SIGNAL(finished()), this, SLOT(slot_hide_items()));
}

//слоты конца анимаций show hide
void HUD_ITEM_SHIELD::slot_hide_items()
{
    if(tl_anim_items->direction() == QTimeLine::Backward){
        foreach (QGraphicsItemAnimation* anim, *lst_anims) {
           anim->item()->setVisible(false);
        }
    }

    disconnect(tl_anim_items, SIGNAL(finished()), this, SLOT(slot_hide_items()));
}

void HUD_ITEM_SHIELD::slot_show_items()
{
    if(tl_anim_items->direction() == QTimeLine::Forward){
        int cnt = 0;

        foreach (QGraphicsItemAnimation* anim, *lst_anims) {
           anim->item()->setVisible(true);
           cnt++;

           if(cnt == points)
               break;
        }
    }

    disconnect(tl_anim_items, SIGNAL(finished()), this, SLOT(slot_show_items()));
}
